package Reflect;

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.Arrays;

public class Main {
    public static void main(String[] args) {
       test2();
    }
    public static void test2(){
        try{
            Class<?> clazz = Class.forName("Reflect.Test1");//通过全类名获得class对象
            Constructor<?> constructor = clazz.getConstructor();//默认是无参构造函数
            Object obj = constructor.newInstance();//用构造器实例化一个对象

            Field field = clazz.getField("d");//取出取出Test1这个clazz中d字段对象   这里当然，只能取public的
            System.out.println(field.get(obj));//传入obj这个对象实例，field对象从中取出obj的a字段
            field = clazz.getField("f");//取出Test1这个clazz中f数组的field对象
            System.out.println(Arrays.toString((int[]) field.get(obj))); //取出f数组

            Method method = clazz.getMethod("print");//方法名作为参数，取出方法实例
            method.invoke(obj);//告知调用obj实例对象的method方法实例（即print）
            //下面是有参数的方法：
            method = clazz.getMethod("printWithOneIntOneStringParm", int.class,String.class);//后面是位置参数的类对象
            method.invoke(obj,3,"okstring");//invoke时按照位置参数传入参数

            //获取指定的构造器（按照参数class类型）
            constructor = clazz.getConstructor(int.class,int[].class);
            int []f = {1,32,3};
            constructor.newInstance(666,f);

        }catch (Exception e){
            throw new RuntimeException(e);
        }




    }
    public static void test1(){
        Test1 test1 = new Test1();
        Class clazz = test1.getClass();
        //获取public构造器
        Constructor[] constructors = clazz.getConstructors();
        //获取public字段
        Field[] fields = clazz.getFields();
        //获取public方法
        Method[] methods = clazz.getMethods();

        //获取clazz中在类中声明的构造器[所有构造器]
        constructors = clazz.getDeclaredConstructors();
        //获取clazz中在类中声明的字段[所有字段]
        fields = clazz.getDeclaredFields();
        //获取clazz中在类中声明的方法[所有方法]
        methods = clazz.getDeclaredMethods();
        for(Constructor constructor:constructors){
            System.out.println(constructor);
        }
        for(Field field:fields){
            System.out.println(field);
        }
        for(Method method :methods){
            System.out.println(method);
        }
    }
}
